import os
import shutil
from pathlib import Path

from cli_parser import parse_arguments
from pak_gener import dir2pak

LOCALIZATIONS = ['Chineses', 'Chineset', 'Czech', 'English', 'French', 'German', 'Italian', 'Japanese', 'Korean',
                 'Polish', 'Portuguese', 'Russian', 'Spanish', 'Turkish', 'Ukrainian']
BASE_FILE_PREFIX = ['.json', '.manifest', '.txt']


class ModdingGenerator:
    def __init__(self, args):
        self.args = args
        self.input_dir = Path(args.input_dir).absolute()
        self.mod_name = self.input_dir.name
        self.output_root_dir = Path(args.output_dir).absolute()
        self.output_dir = f'{self.output_root_dir}/{self.mod_name}'
        self.zip = args.zip
        self.delete = args.delete
        self.verbose = args.verbose

    def generate(self):
        # 在这里编写生成MOD的逻辑
        print('---- KCD II MOD 打包器 - by Feirnova -----')
        print(f'生成MOD: {self.input_dir} -> {self.output_root_dir}')
        print(f'详细模式: {"启用" if self.verbose else "禁用"} \t 是否生成压缩包: \
{"启用" if self.zip else "禁用"} \t 是否删除输出文件夹: {"是" if self.delete else "否"}')
        print(f'Mod名称:{self.mod_name}\t')
        print('----------------------------------------')
        print('开始生成MOD...')
        self._clean_output_dir()
        self._copy_base_file()
        self._gen_data_dir()
        self._gen_localization_dir()
        self._gen_zip()
        print('MOD生成完成')
        print('----------------------------------------')

    def _copy_base_file(self):
        # 源Base文件夹目录
        for root, dirs, files in os.walk(self.input_dir):
            for file in files:
                if os.path.splitext(file)[1] in BASE_FILE_PREFIX:
                    if self.verbose:
                        print(f'找到匹配的基础文件: {file},开始移动')
                    # 源文件路径
                    source_file_path = Path(f'{root}/{file}')
                    # 目标文件路径
                    target_file_path = Path(f'{self.output_dir}/{file}')
                    # 复制文件到输出目录
                    shutil.copy(source_file_path, target_file_path)

    def _gen_data_dir(self):
        # 源Data文件夹目录
        source_data_dir = Path(f'{self.input_dir}/Data')
        # 目标Data文件夹目录
        target_data_dir = Path(f'{self.output_dir}/Data')
        # 查询输入目录下是否存在Data文件夹,如存在则在输出目录下创建Data文件夹
        if self.verbose:
            print('查询输入目录下是否存在Data文件夹,如存在则在输出目录下创建Data文件夹')
            print(f'输入Data全目录: {source_data_dir}')
            print(f'输出Data目录: {target_data_dir}')
        if source_data_dir.exists():
            if self.verbose:
                print('存在Data文件夹,在输出目录下创建Data文件夹')
            target_data_dir.mkdir(parents=True, exist_ok=True)
            if self.verbose:
                print('创建Data文件夹完成,开始打包Data文件夹到输出目录')
            target_data_file_path = Path(f'{target_data_dir}/{self.mod_name}.pak')
            dir2pak(source_data_dir, target_data_file_path)
            if self.verbose:
                print('打包Data文件夹到输出目录完成')
        else:
            if self.verbose:
                print('不存在Data文件夹,跳过')

    def _gen_localization_dir(self):
        # 源Localization文件夹目录
        source_localization_dir = Path(f'{self.input_dir}/Localization')
        # 目标Localization文件夹目录
        target_localization_dir = Path(f'{self.output_dir}/Localization')
        # 查询输入目录下是否存在Localization文件夹,如存在则在输出目录下创建Localization文件夹
        if self.verbose:
            print('查询输入目录下是否存在Localization文件夹,如存在则在输出目录下创建Localization文件夹')
            print(f'输入Localization全目录: {source_localization_dir}')
            print(f'输出Localization目录: {target_localization_dir}')
        if source_localization_dir.exists():
            if self.verbose:
                print('存在Localization文件夹,在输出目录下创建Localization文件夹')
            target_localization_dir.mkdir(parents=True, exist_ok=True)
            if self.verbose:
                print('创建Localization文件夹完成,开始打包Localization文件夹到输出目录')
            # 循环遍历Localization文件夹下的所有文件夹
            for root, dirs, files in os.walk(source_localization_dir):
                for dir in dirs:
                    # 文件夹名称转首字母大写进行匹配
                    dir_capitalize = dir.capitalize()
                    if dir_capitalize in LOCALIZATIONS:
                        if self.verbose:
                            print(f'找到匹配的语言文件夹: {dir_capitalize},开始打包')
                        # 源文件夹路径
                        source_lang_dir = Path(f'{source_localization_dir}/{dir}')
                        # 目标语言pak包路径
                        target_lang_pak_path = Path(f'{target_localization_dir}/{dir_capitalize}_xml.pak')
                        dir2pak(source_lang_dir, target_lang_pak_path)
                        if self.verbose:
                            print(f'打包{dir_capitalize}_xml.pak完成')

    def _clean_output_dir(self):
        # 检查输出目录是否存在,如不存在则创建
        if self.verbose:
            print('检查输出目录是否存在,如不存在则创建')
        output_dir = Path(self.output_dir)
        output_dir.mkdir(parents=True, exist_ok=True)
        # 清理输出目录(清除当前目录下所有文件和文件夹)
        if self.verbose:
            print('清理输出目录和zip文件')
        for file in output_dir.iterdir():
            if file.is_file():
                file.unlink()
            elif file.is_dir():
                shutil.rmtree(file)

    def _gen_zip(self):
        # 检查是否生成压缩包
        if not self.zip:
            if self.verbose:
                print('不生成压缩包,跳过')
            return
        # 生成压缩包
        if self.verbose:
            print('开始生成压缩包')
        shutil.make_archive(self.output_dir, 'zip', self.output_root_dir, self.mod_name)
        if self.verbose:
            print('生成压缩包完成')
        if self.delete:
            if self.verbose:
                print('删除输出目录')
            shutil.rmtree(self.output_dir)
            if self.verbose:
                print('删除输出目录完成')


if __name__ == '__main__':
    parse_args = parse_arguments()
    mg = ModdingGenerator(parse_args)
    mg.generate()
    input('按任意键退出')
